#include "xx_tool.h"

#define servoPin 14   // 根据实际连接更改
#define freq 50       // 舵机工作的频率(Hz)
#define resolution 16 // 分辨率位数，16位更精确

// 设置舵机的最小和最大PWM值对应的行为（针对360度舵机）
int stopPulseWidth = 1500; // 停止状态的脉冲宽度(us)
int minPulseWidth = 1300;  // 最小脉冲宽度(us)，完全逆时针方向
int maxPulseWidth = 1700;  // 最大脉冲宽度(us)，完全顺时针方向

void xx_mg90_360_setup()
{
    // 设置LEDC通道属性
    ledcSetup(0, freq, resolution); // channel 0, 50 Hz, 8-bit width
    ledcAttachPin(servoPin, 0);     // 将channel 0绑定到指定的GPIO引脚
}
/**
 * 根据给定的脉冲宽度设置舵机PWM输出
 * @param pulseWidth PWM脉冲宽度(us)
 */
void setServoSpeed(int pulseWidth)
{
    int dutyCycle = (pulseWidth * (1 << resolution)) / 20000; // 计算占空比
    if (dutyCycle > (1 << resolution) - 1)
        dutyCycle = (1 << resolution) - 1;
    else if (dutyCycle < 0)
        dutyCycle = 0;

    ledcWrite(0, dutyCycle);
}
/**
 * 设置PWM输出以停止舵机
 */
void xx_mg90_360_stopServo()
{
    setServoSpeed(stopPulseWidth);
    Serial.println("Stopping the servo.");
}

/**
 * 设置PWM输出以顺时针旋转舵机
 */
void xx_mg90_360_rotateClockwise()
{
    setServoSpeed(maxPulseWidth);
    Serial.println("Rotating the servo clockwise.");
}

/**
 * 设置PWM输出以逆时针旋转舵机
 */
void xx_mg90_360_rotateCounterClockwise()
{
    setServoSpeed(minPulseWidth);
    Serial.println("Rotating the servo counter-clockwise.");
}
